package com.young.rabbitmq.ps;

import com.rabbitmq.client.*;
import com.young.rabbitmq.util.ConnectionUtil;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class MyConsumer {


    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtil.buildConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(Producer.FANOUT_QUEUE_1,true,false,false,null);

        // 创建消费者
        Consumer consumer = new DefaultConsumer(channel){
            /**
             *
             * @param consumerTag 消费者标签。在channel.basicConsumer的时候可以指定
             * @param envelope 消息包的内容，可以从中获取消息id,消息routinkey,交换机，消息和重传标志（收到消息失败后是否需要重新发送）
             * @param properties 属性信息
             * @param body  消息体
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("路由键："+envelope.getRoutingKey());
                System.out.println("交换机:"+envelope.getExchange());
                System.out.println("消息id:"+envelope.getDeliveryTag());

                System.out.println("消息体："+new String(body,"utf-8"));

            }
        };
        /*
            监听消息：
             参数1：队列名称
             参数2：是否自动确认，设置为true表示接收到消息后自动向mq发送ack,mq收到ack后会删除消息，设置为false则需要手动确认
             参数3：消息接收到后回调
         */
        channel.basicConsume(Producer.FANOUT_QUEUE_1,true,consumer);

        // 关闭资源，如果要消费者一致监听接收消息，这里可以不关闭资源
        /*channel.close();
        connection.close();*/


    }
}
